{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.7.3"
    },
    "colab": {
      "name": "CS246 - Colab 0 (Spark Tutorial).ipynb",
      "provenance": [],
      "collapsed_sections": [
        "LLan66cXSagf"
      ],
      "toc_visible": true,
      "machine_shape": "hm"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "GTwDFnjHMk25",
        "colab_type": "text"
      },
      "source": [
        "# CS246 - Colab 0\n",
        "## Spark Tutorial\n",
        "\n",
        "In this tutorial you will learn how to use [Apache Spark](https://spark.apache.org) in local mode on a Colab enviroment.\n",
        "\n",
        "Credits to [Tiziano Piccardi](http://piccardi.me/) for his Spark Tutorial used in the Applied Data Analysis class at EPFL."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "eXQzA01OS_yQ",
        "colab_type": "text"
      },
      "source": [
        "### Setup"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "AbYZoVVWOZA5",
        "colab_type": "text"
      },
      "source": [
        "Let's setup Spark on your Colab environment.  Run the cell below!"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "dhzk3GE6S9RC",
        "colab_type": "code",
        "outputId": "55fc8554-3e52-405f-8990-bf16944c5bb3",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 343
        }
      },
      "source": [
        "!pip install pyspark\n",
        "!pip install -U -q PyDrive\n",
        "!apt install openjdk-8-jdk-headless -qq\n",
        "import os\n",
        "os.environ[\"JAVA_HOME\"] = \"/usr/lib/jvm/java-8-openjdk-amd64\""
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Collecting pyspark\n",
            "\u001b[?25l  Downloading https://files.pythonhosted.org/packages/87/21/f05c186f4ddb01d15d0ddc36ef4b7e3cedbeb6412274a41f26b55a650ee5/pyspark-2.4.4.tar.gz (215.7MB)\n",
            "\u001b[K     |████████████████████████████████| 215.7MB 60kB/s \n",
            "\u001b[?25hCollecting py4j==0.10.7\n",
            "\u001b[?25l  Downloading https://files.pythonhosted.org/packages/e3/53/c737818eb9a7dc32a7cd4f1396e787bd94200c3997c72c1dbe028587bd76/py4j-0.10.7-py2.py3-none-any.whl (197kB)\n",
            "\u001b[K     |████████████████████████████████| 204kB 61.3MB/s \n",
            "\u001b[?25hBuilding wheels for collected packages: pyspark\n",
            "  Building wheel for pyspark (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
            "  Created wheel for pyspark: filename=pyspark-2.4.4-py2.py3-none-any.whl size=216130387 sha256=fc6682aa9b019a3998c554f3d46fca70d51c86e65cb9e4e14c36661f0206c900\n",
            "  Stored in directory: /root/.cache/pip/wheels/ab/09/4d/0d184230058e654eb1b04467dbc1292f00eaa186544604b471\n",
            "Successfully built pyspark\n",
            "Installing collected packages: py4j, pyspark\n",
            "Successfully installed py4j-0.10.7 pyspark-2.4.4\n",
            "openjdk-8-jdk-headless is already the newest version (8u232-b09-0ubuntu1~18.04.1).\n",
            "The following package was automatically installed and is no longer required:\n",
            "  libnvidia-common-430\n",
            "Use 'apt autoremove' to remove it.\n",
            "0 upgraded, 0 newly installed, 0 to remove and 7 not upgraded.\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ctU1dYjfOif7",
        "colab_type": "text"
      },
      "source": [
        "Now we authenticate a Google Drive client to download the file we will be processing in our Spark job.\n",
        "\n",
        "**Make sure to follow the interactive instructions.**"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "1dfnX7IAOkvH",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "from pydrive.auth import GoogleAuth\n",
        "from pydrive.drive import GoogleDrive\n",
        "from google.colab import auth\n",
        "from oauth2client.client import GoogleCredentials\n",
        "\n",
        "# Authenticate and create the PyDrive client\n",
        "auth.authenticate_user()\n",
        "gauth = GoogleAuth()\n",
        "gauth.credentials = GoogleCredentials.get_application_default()\n",
        "drive = GoogleDrive(gauth)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "UF5nuSdyTJpc",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "id='1L6pCQkldvdBoaEhRFzL0VnrggEFvqON4'\n",
        "downloaded = drive.CreateFile({'id': id}) \n",
        "downloaded.GetContentFile('Bombing_Operations.json.gz')\n",
        "\n",
        "id='14dyBmcTBA32uXPxDbqr0bFDIzGxMTWwl'\n",
        "downloaded = drive.CreateFile({'id': id}) \n",
        "downloaded.GetContentFile('Aircraft_Glossary.json.gz')  "
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "wA49WWqmO5rR",
        "colab_type": "text"
      },
      "source": [
        "If you executed the cells above, you should be able to see the files *Bombing_Operations.json.gz* and *Aircraft_Glossary.json.gz* under the \"Files\" tab on the left panel."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "xgQaRx6rSaf9",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# Let's import the libraries we will need\n",
        "import pandas as pd\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "%matplotlib inline\n",
        "\n",
        "import pyspark\n",
        "from pyspark.sql import *\n",
        "from pyspark.sql.functions import *\n",
        "from pyspark import SparkContext, SparkConf"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "uUD5XpD_SagA",
        "colab_type": "text"
      },
      "source": [
        "Let's initialize the Spark context.\n"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "7ft3VivrSagB",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# create the session\n",
        "conf = SparkConf().set(\"spark.ui.port\", \"4050\")\n",
        "\n",
        "# create the context\n",
        "sc = pyspark.SparkContext(conf=conf)\n",
        "spark = SparkSession.builder.getOrCreate()"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "-n20ixkgSagD",
        "colab_type": "text"
      },
      "source": [
        "You can easily check the current version and get the link of the web interface. In the Spark UI, you can monitor the progress of your job and debug the performance bottlenecks (if your Colab is running with a **local runtime**)."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Fl4RHbqFSagE",
        "colab_type": "code",
        "outputId": "e0ff078d-0ace-4114-d220-9578ee513dac",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 216
        }
      },
      "source": [
        "spark"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "\n",
              "            <div>\n",
              "                <p><b>SparkSession - in-memory</b></p>\n",
              "                \n",
              "        <div>\n",
              "            <p><b>SparkContext</b></p>\n",
              "\n",
              "            <p><a href=\"http://22bb07d23d3e:4050\">Spark UI</a></p>\n",
              "\n",
              "            <dl>\n",
              "              <dt>Version</dt>\n",
              "                <dd><code>v2.4.4</code></dd>\n",
              "              <dt>Master</dt>\n",
              "                <dd><code>local[*]</code></dd>\n",
              "              <dt>AppName</dt>\n",
              "                <dd><code>pyspark-shell</code></dd>\n",
              "            </dl>\n",
              "        </div>\n",
              "        \n",
              "            </div>\n",
              "        "
            ],
            "text/plain": [
              "<pyspark.sql.session.SparkSession at 0x7f277c151ef0>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 8
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "xlw1Mgx0T9-l",
        "colab_type": "text"
      },
      "source": [
        "If you are running this Colab on the Google hosted runtime, the cell below will create a *ngrok* tunnel which will allow you to still check the Spark UI."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "cYYlUTWYQMjb",
        "colab_type": "code",
        "outputId": "6b1c46b7-daa3-42e5-fa85-466990b841f8",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 272
        }
      },
      "source": [
        "!wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip\n",
        "!unzip ngrok-stable-linux-amd64.zip\n",
        "get_ipython().system_raw('./ngrok http 4050 &')\n",
        "!curl -s http://localhost:4040/api/tunnels | python3 -c \\\n",
        "    \"import sys, json; print(json.load(sys.stdin)['tunnels'][0]['public_url'])\""
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "--2020-01-14 19:55:40--  https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip\n",
            "Resolving bin.equinox.io (bin.equinox.io)... 52.3.53.111, 52.5.84.255, 34.202.58.243, ...\n",
            "Connecting to bin.equinox.io (bin.equinox.io)|52.3.53.111|:443... connected.\n",
            "HTTP request sent, awaiting response... 200 OK\n",
            "Length: 13773305 (13M) [application/octet-stream]\n",
            "Saving to: ‘ngrok-stable-linux-amd64.zip.1’\n",
            "\n",
            "ngrok-stable-linux- 100%[===================>]  13.13M  14.2MB/s    in 0.9s    \n",
            "\n",
            "2020-01-14 19:55:41 (14.2 MB/s) - ‘ngrok-stable-linux-amd64.zip.1’ saved [13773305/13773305]\n",
            "\n",
            "Archive:  ngrok-stable-linux-amd64.zip\n",
            "replace ngrok? [y]es, [n]o, [A]ll, [N]one, [r]ename: y\n",
            "  inflating: ngrok                   \n",
            "https://0affa0e6.ngrok.io\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "gewv-lKMSagI",
        "colab_type": "text"
      },
      "source": [
        "# Vietnam War\n",
        "\n",
        "**Pres. Johnson**: _What do you think about this Vietnam thing? I’d like to hear you talk a little bit._\n",
        "\n",
        "**Sen. Russell**: _Well, frankly, Mr. President, it’s the damn worse mess that I ever saw, and I don’t like to brag and I never have been right many times in my life, but I knew that we were going to get into this sort of mess when we went in there._\n",
        "\n",
        "May 27, 1964\n",
        "\n",
        "![banner](https://raw.githubusercontent.com/epfl-ada/2019/c17af0d3c73f11cb083717b7408fedd86245dc4d/Tutorials/04%20-%20Scaling%20Up/img/banner.jpg)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "skjUv84VSagJ",
        "colab_type": "text"
      },
      "source": [
        "----\n",
        "\n",
        "The Vietnam War, also known as the Second Indochina War, and in Vietnam as the Resistance War Against America or simply the American War, was a conflict that occurred in Vietnam, Laos, and Cambodia from 1 November 1955 to the fall of Saigon on 30 April 1975. It was the second of the Indochina Wars and was officially fought between North Vietnam and the government of South Vietnam.\n",
        "\n",
        "**The dataset describes all the air force operation in during the Vietnam War.**\n",
        "\n",
        "**Bombing_Operations** [Get the dataset here](https://drive.google.com/a/epfl.ch/file/d/1L6pCQkldvdBoaEhRFzL0VnrggEFvqON4/view?usp=sharing)\n",
        "\n",
        "- AirCraft: _Aircraft model (example: EC-47)_\n",
        "- ContryFlyingMission: _Country_\n",
        "- MissionDate: _Date of the mission_\n",
        "- OperationSupported: _Supported War operation_ (example: [Operation Rolling Thunder](https://en.wikipedia.org/wiki/Operation_Rolling_Thunder))\n",
        "- PeriodOfDay: _Day or night_\n",
        "- TakeoffLocation: _Take off airport_\n",
        "- TimeOnTarget\n",
        "- WeaponType\n",
        "- WeaponsLoadedWeight\n",
        "\n",
        "**Aircraft_Glossary** [Get the dataset here](https://drive.google.com/a/epfl.ch/file/d/14dyBmcTBA32uXPxDbqr0bFDIzGxMTWwl/view?usp=sharing)\n",
        "\n",
        "- AirCraft: _Aircraft model (example: EC-47)_\n",
        "- AirCraftName\n",
        "- AirCraftType\n",
        "\n",
        "**Dataset Information:**\n",
        "\n",
        "THOR is a painstakingly cultivated database of historic aerial bombings from World War I through Vietnam. THOR has already proven useful in finding unexploded ordnance in Southeast Asia and improving Air Force combat tactics:\n",
        "https://www.kaggle.com/usaf/vietnam-war-bombing-operations"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "VSWoULeWSagJ",
        "colab_type": "text"
      },
      "source": [
        "Load the datasets:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "XLyVPuLXSagK",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "Bombing_Operations = spark.read.json(\"Bombing_Operations.json.gz\")\n",
        "Aircraft_Glossary = spark.read.json(\"Aircraft_Glossary.json.gz\")"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "MP2JmCeoSagM",
        "colab_type": "text"
      },
      "source": [
        "Check the schema:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "KpUT8viNSagM",
        "colab_type": "code",
        "outputId": "5f9e5cbb-f826-44fa-b913-73799592ce5e",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 221
        }
      },
      "source": [
        "Bombing_Operations.printSchema()"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "root\n",
            " |-- AirCraft: string (nullable = true)\n",
            " |-- ContryFlyingMission: string (nullable = true)\n",
            " |-- MissionDate: string (nullable = true)\n",
            " |-- OperationSupported: string (nullable = true)\n",
            " |-- PeriodOfDay: string (nullable = true)\n",
            " |-- TakeoffLocation: string (nullable = true)\n",
            " |-- TargetCountry: string (nullable = true)\n",
            " |-- TimeOnTarget: double (nullable = true)\n",
            " |-- WeaponType: string (nullable = true)\n",
            " |-- WeaponsLoadedWeight: long (nullable = true)\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "6LJsbmlxSagO",
        "colab_type": "code",
        "outputId": "b7beb126-0965-43ef-de68-aba3013737d5",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 102
        }
      },
      "source": [
        "Aircraft_Glossary.printSchema()"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "root\n",
            " |-- AirCraft: string (nullable = true)\n",
            " |-- AirCraftName: string (nullable = true)\n",
            " |-- AirCraftType: string (nullable = true)\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "1jP5IBezSagQ",
        "colab_type": "text"
      },
      "source": [
        "Get a sample with `take()`:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "jrJpiG5ISagQ",
        "colab_type": "code",
        "outputId": "d7b5bdb9-d72f-4f9a-e7ec-bd26d0ef9279",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 88
        }
      },
      "source": [
        "Bombing_Operations.take(3)"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[Row(AirCraft='EC-47', ContryFlyingMission='UNITED STATES OF AMERICA', MissionDate='1971-06-05', OperationSupported=None, PeriodOfDay='D', TakeoffLocation='TAN SON NHUT', TargetCountry='CAMBODIA', TimeOnTarget=1005.0, WeaponType=None, WeaponsLoadedWeight=0),\n",
              " Row(AirCraft='EC-47', ContryFlyingMission='UNITED STATES OF AMERICA', MissionDate='1972-12-26', OperationSupported=None, PeriodOfDay='D', TakeoffLocation='NAKHON PHANOM', TargetCountry='SOUTH VIETNAM', TimeOnTarget=530.0, WeaponType=None, WeaponsLoadedWeight=0),\n",
              " Row(AirCraft='RF-4', ContryFlyingMission='UNITED STATES OF AMERICA', MissionDate='1973-07-28', OperationSupported=None, PeriodOfDay='D', TakeoffLocation='UDORN AB', TargetCountry='LAOS', TimeOnTarget=730.0, WeaponType=None, WeaponsLoadedWeight=0)]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 14
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "iu7n8KKjSagS",
        "colab_type": "text"
      },
      "source": [
        "Get a formatted sample with `show()`:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "nwYZrwanSagT",
        "colab_type": "code",
        "outputId": "4552f7b1-8ce8-480b-8663-1b6aa400c74a",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 459
        }
      },
      "source": [
        "Aircraft_Glossary.show()"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "+--------+--------------------+--------------------+\n",
            "|AirCraft|        AirCraftName|        AirCraftType|\n",
            "+--------+--------------------+--------------------+\n",
            "|     A-1|Douglas A-1 Skyra...|         Fighter Jet|\n",
            "|    A-26|Douglas A-26 Invader|        Light Bomber|\n",
            "|    A-37|Cessna A-37 Drago...|Light ground-atta...|\n",
            "|     A-4|McDonnell Douglas...|         Fighter Jet|\n",
            "|     A-5|North American A-...|          Bomber Jet|\n",
            "|     A-6|Grumman A-6 Intruder|     Attack Aircraft|\n",
            "|     A-7|  LTV A-7 Corsair II|     Attack Aircraft|\n",
            "|  AC-119|Fairchild AC-119 ...|Military Transpor...|\n",
            "|  AC-123|Fairchild C-123 P...|Military Transpor...|\n",
            "|  AC-130|Lockheed AC-130 S...|Fixed wing ground...|\n",
            "|   AC-47|Douglas AC-47 Spooky|Ground attack air...|\n",
            "|    AH-1| Bell AH-1 HueyCobra|          Helicopter|\n",
            "|     B-1| Rockwell B-1 Lancer|Heavy strategic b...|\n",
            "|    B-52| B-52 Stratofortress|    Strategic bomber|\n",
            "|    B-57|Martin B-57 Canberra|     Tactical Bomber|\n",
            "|    B-66|Douglas B-66 Dest...|        Light Bomber|\n",
            "|     C-1| Grumman C-1A Trader|           Transport|\n",
            "|   C-117|     C-117D Skytrain|           Transport|\n",
            "|   C-119|Fairchild C-119 F...|Military Transpor...|\n",
            "|   C-123|Fairchild C-123 P...|Military Transpor...|\n",
            "+--------+--------------------+--------------------+\n",
            "only showing top 20 rows\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "hMAab2rJSagU",
        "colab_type": "code",
        "outputId": "95fd1434-98f4-4ac2-a92d-b07b50e4cf34",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        }
      },
      "source": [
        "print(\"In total there are {0} operations\".format(Bombing_Operations.count()))"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "In total there are 4400775 operations\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "hkKWEEcLSagW",
        "colab_type": "text"
      },
      "source": [
        "## Question 1: Which countries are involved and in how many missions? \n",
        "\n",
        "Keywords: `Dataframe API`, `SQL`, `group by`, `sort`"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "MwPL1-P5SagW",
        "colab_type": "text"
      },
      "source": [
        "Let's group the missions by `ContryFlyingMission` and count how many records exist:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "scrolled": true,
        "id": "BWcMVcgwSagX",
        "colab_type": "code",
        "outputId": "734d91ac-25b9-4f6f-d148-4e2f1200ff75",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 187
        }
      },
      "source": [
        "missions_counts = Bombing_Operations.groupBy(\"ContryFlyingMission\")\\\n",
        "                                    .agg(count(\"*\").alias(\"MissionsCount\"))\\\n",
        "                                    .sort(desc(\"MissionsCount\"))\n",
        "missions_counts.show()"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "+--------------------+-------------+\n",
            "| ContryFlyingMission|MissionsCount|\n",
            "+--------------------+-------------+\n",
            "|UNITED STATES OF ...|      3708997|\n",
            "|     VIETNAM (SOUTH)|       622013|\n",
            "|                LAOS|        32777|\n",
            "|       KOREA (SOUTH)|        24469|\n",
            "|           AUSTRALIA|        12519|\n",
            "+--------------------+-------------+\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "t5trEAkzSagY",
        "colab_type": "text"
      },
      "source": [
        "In this case we used the DataFrame API, but we could rewite the `groupBy` using pure SQL:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "3slo-sXOSagZ",
        "colab_type": "code",
        "outputId": "3e3b0c83-5758-42a0-a11c-71cd55f6c5f3",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 187
        }
      },
      "source": [
        "Bombing_Operations.registerTempTable(\"Bombing_Operations\")\n",
        "\n",
        "query = \"\"\"\n",
        "SELECT ContryFlyingMission, count(*) as MissionsCount\n",
        "FROM Bombing_Operations\n",
        "GROUP BY ContryFlyingMission\n",
        "ORDER BY MissionsCount DESC\n",
        "\"\"\"\n",
        "\n",
        "missions_counts = spark.sql(query)\n",
        "missions_counts.show()"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "+--------------------+-------------+\n",
            "| ContryFlyingMission|MissionsCount|\n",
            "+--------------------+-------------+\n",
            "|UNITED STATES OF ...|      3708997|\n",
            "|     VIETNAM (SOUTH)|       622013|\n",
            "|                LAOS|        32777|\n",
            "|       KOREA (SOUTH)|        24469|\n",
            "|           AUSTRALIA|        12519|\n",
            "+--------------------+-------------+\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "5wQNXQnOSaga",
        "colab_type": "text"
      },
      "source": [
        "The Dataframe is small enough to be moved to Pandas:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "4nVJdPLDSagb",
        "colab_type": "code",
        "outputId": "d3027cf2-315e-493b-9754-9ddc33e16df2",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 204
        }
      },
      "source": [
        "missions_count_pd = missions_counts.toPandas()\n",
        "missions_count_pd.head()"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>ContryFlyingMission</th>\n",
              "      <th>MissionsCount</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>UNITED STATES OF AMERICA</td>\n",
              "      <td>3708997</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>VIETNAM (SOUTH)</td>\n",
              "      <td>622013</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>LAOS</td>\n",
              "      <td>32777</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>KOREA (SOUTH)</td>\n",
              "      <td>24469</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>AUSTRALIA</td>\n",
              "      <td>12519</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "        ContryFlyingMission  MissionsCount\n",
              "0  UNITED STATES OF AMERICA        3708997\n",
              "1           VIETNAM (SOUTH)         622013\n",
              "2                      LAOS          32777\n",
              "3             KOREA (SOUTH)          24469\n",
              "4                 AUSTRALIA          12519"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 19
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "VQedtuQZSagc",
        "colab_type": "text"
      },
      "source": [
        "Let's plot a barchart with the number of missions by country:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "tgbceprDSagd",
        "colab_type": "code",
        "outputId": "60ff9e39-d6ff-4662-99ab-d2720252cff4",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 609
        }
      },
      "source": [
        "pl = missions_count_pd.plot(kind=\"bar\", \n",
        "                            x=\"ContryFlyingMission\", y=\"MissionsCount\", \n",
        "                            figsize=(10, 7), log=True, alpha=0.5, color=\"olive\")\n",
        "pl.set_xlabel(\"Country\")\n",
        "pl.set_ylabel(\"Number of Missions (Log scale)\")\n",
        "pl.set_title(\"Number of missions by Country\")"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Text(0.5, 1.0, 'Number of missions by Country')"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 20
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nww68+MUv5tZbbwVgwYIF99/956abbmLk1ownnngi++23H3vuuSfbbrstb3/72+8/75///Gd22mkn\nXvnKV07759qXBZmD+iVJasb+++/Paaedxh133MFll13GbrvttsrXHX300Zx99tlceumlLFmyBIDP\nfOYzHHrooVxyySUsW7aMOXPmPGCfM888k0suuYRLL72U73znOxx++OH85je/AeAnP/kJH/vYx/jZ\nz37Gtddey49+9CNuvvlmvvrVr3LFFVdw2WWX8e53vxuAyy+/nF122WWVuV7zmtdwzDHHcNlll7H9\n9tvz3ve+d9L3fMkll3D66afz05/+lNNPP50bbriBD37wg6y//vpccskl/Pu//3vHP7/x9GVBJkmS\nmrHDDjtw3XXXceqpp7LXXnuN+7rdd9+d173udXzuc5/j3nvvBeBpT3sa73//+znmmGO4/vrrWX/9\n9R+wzw9/+EMWLVrErFmzeMQjHsGzn/1sLrzwQgB23XVX5syZw1prrcVOO+3Eddddx+zZs1lvvfU4\n8MADOfPMM3nwgx88YfaVK1fy+9//nmc/+9kAvPa1r+X888+f9D3vscce959ru+224/rrx70l5Wqz\nIJMkSVOyzz77cNhhhz2gu3Ksz3zmM/zzP/8zN9xwA7vssgs333wzBxxwAEuWLGH99ddnr7324nvf\n+17H51x33XXvfz5r1izuuece1l57bX784x/z0pe+lK9//evsueeeADzxiU/koosumtJ7Wnvttbnv\nvvsA/mrKilWde02zIJMkSVPyhje8gSOPPJLtt99+3Nf87//+L7vtthtHH300m222GTfccAPXXnst\n22yzDW95y1vYd999ueyyyx6wzzOf+UxOP/107r33XlasWMH555/PrrvuOu45/vjHP7Jy5Ur22msv\nPvrRj3LppZcC8M53vpPDDz+c3/72twDcddddfP7zn2f27Nlssskm/OAHPwDglFNOub+1bOutt76/\niPvKV77S0c9hnXXW4e677+7otZPpy6ssnalfkqTmzJkzh7e85S0Tvubwww/n6quvpqrYY4892HHH\nHTnmmGM45ZRTWGeddXjkIx/5V1covvjFL+aCCy5gxx13JAkf+tCHeOQjH8nPf/7zVZ7jtttuY999\n9+WOO+6gqjjuuOOA1oUHv/vd73je855HVZGEN7zhDQCcdNJJvPGNb+T2229nm2224Ytf/CIAhx12\n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\n",
            "text/plain": [
              "<Figure size 720x504 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "1jCZfwK2Sage",
        "colab_type": "text"
      },
      "source": [
        "----"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "LLan66cXSagf",
        "colab_type": "text"
      },
      "source": [
        "## Questions 2: Show the number of missions in time for each of the countries involved.\n",
        "\n",
        "Keywords: `group by`, `parse date`, `plot`\n",
        "\n",
        "Let's select the relevant columns:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "BXNKt5PHSagf",
        "colab_type": "code",
        "outputId": "08874b32-9021-46e2-9fcf-a644998f1b28",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        }
      },
      "source": [
        "missions_countries = Bombing_Operations.selectExpr([\"to_date(MissionDate) as MissionDate\", \"ContryFlyingMission\"])\n",
        "missions_countries"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "DataFrame[MissionDate: date, ContryFlyingMission: string]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 21
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "da9IeKntSagh",
        "colab_type": "text"
      },
      "source": [
        "The filed MissionDate is converted to a Python `date` object.\n",
        "\n",
        "Now we can group by `MissionDate` and `ContryFlyingMission` to get the count:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "TLza0bF9Sagh",
        "colab_type": "code",
        "outputId": "a9c594fc-cad7-4a11-8526-9bfa5b1496fe",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 204
        }
      },
      "source": [
        "missions_by_date = missions_countries\\\n",
        "                    .groupBy([\"MissionDate\", \"ContryFlyingMission\"])\\\n",
        "                    .agg(count(\"*\").alias(\"MissionsCount\"))\\\n",
        "                    .sort(asc(\"MissionDate\")).toPandas()\n",
        "missions_by_date.head()"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>MissionDate</th>\n",
              "      <th>ContryFlyingMission</th>\n",
              "      <th>MissionsCount</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>1965-10-01</td>\n",
              "      <td>UNITED STATES OF AMERICA</td>\n",
              "      <td>447</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>1965-10-02</td>\n",
              "      <td>UNITED STATES OF AMERICA</td>\n",
              "      <td>652</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>1965-10-03</td>\n",
              "      <td>UNITED STATES OF AMERICA</td>\n",
              "      <td>608</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>1965-10-04</td>\n",
              "      <td>UNITED STATES OF AMERICA</td>\n",
              "      <td>532</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>1965-10-05</td>\n",
              "      <td>UNITED STATES OF AMERICA</td>\n",
              "      <td>697</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "  MissionDate       ContryFlyingMission  MissionsCount\n",
              "0  1965-10-01  UNITED STATES OF AMERICA            447\n",
              "1  1965-10-02  UNITED STATES OF AMERICA            652\n",
              "2  1965-10-03  UNITED STATES OF AMERICA            608\n",
              "3  1965-10-04  UNITED STATES OF AMERICA            532\n",
              "4  1965-10-05  UNITED STATES OF AMERICA            697"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 22
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "IAhOE55wSagj",
        "colab_type": "text"
      },
      "source": [
        "Now we can plot the content with a different series for each country:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "wLq6ulAySagl",
        "colab_type": "code",
        "outputId": "4f79a2cf-4021-466d-b91d-f757cd9ce7b7",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 393
        }
      },
      "source": [
        "fig = plt.figure(figsize=(10, 6))\n",
        "\n",
        "# iterate the different groups to create a different series\n",
        "for country, missions in missions_by_date.groupby(\"ContryFlyingMission\"): \n",
        "    plt.plot(missions[\"MissionDate\"], missions[\"MissionsCount\"], label=country)\n",
        "\n",
        "plt.legend(loc='best')"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<matplotlib.legend.Legend at 0x7f277b18c668>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 23
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\npZRSSikVZv8HDhBo2392VR8AAAAASUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 720x432 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "GEMzTwxGSagp",
        "colab_type": "text"
      },
      "source": [
        "We can observe how South Vietnam increased its missions starting from 1970. The drop in 1973 is motivated by the [Paris Peace Accords](https://en.wikipedia.org/wiki/Paris_Peace_Accords) that took place on January 27th, 1973, to establish peace in Vietnam and end the war."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "dl6m0B6iSagp",
        "colab_type": "text"
      },
      "source": [
        "----"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "uEwBspLySagp",
        "colab_type": "text"
      },
      "source": [
        "## Question 3: Who bombed this location?\n",
        "\n",
        "Keywords: `RDD map reduce` `cache` `save results`\n",
        "\n",
        "<img style=\"float: right;\" src=\"https://raw.githubusercontent.com/epfl-ada/2019/c17af0d3c73f11cb083717b7408fedd86245dc4d/Tutorials/04%20-%20Scaling%20Up/img/Hanoi_POL1966.jpg\">\n",
        "\n",
        "This picture is the Hanoi POL facility (North Vietnam) burning after it was attacked by the U.S. Air Force on 29 June 1966 in the context of the Rolling Thunder operation. \n",
        "\n",
        "We are interested in discovering what was the most common take-off location during that day."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "uq6jqsgBSagq",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "jun_29_operations = Bombing_Operations.where(\"MissionDate = '1966-06-29' AND TargetCountry='NORTH VIETNAM'\")"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Qurjwd0zSagr",
        "colab_type": "text"
      },
      "source": [
        "Which coutries scheduled missions that day?"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "uoiVSE7NSags",
        "colab_type": "code",
        "outputId": "dc471853-1973-42f1-c77f-f969a079d672",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 111
        }
      },
      "source": [
        "jun_29_operations.groupBy(\"ContryFlyingMission\").agg(count(\"*\").alias(\"MissionsCount\")).toPandas()"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>ContryFlyingMission</th>\n",
              "      <th>MissionsCount</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>VIETNAM (SOUTH)</td>\n",
              "      <td>6</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>UNITED STATES OF AMERICA</td>\n",
              "      <td>389</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "        ContryFlyingMission  MissionsCount\n",
              "0           VIETNAM (SOUTH)              6\n",
              "1  UNITED STATES OF AMERICA            389"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 26
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "-0Q2bS4KSagt",
        "colab_type": "text"
      },
      "source": [
        "Most of the operation that day were performed by USA airplanes."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "cLec-CkmSagu",
        "colab_type": "code",
        "outputId": "22b4595b-ff48-4f60-d428-9c3ed3d86d51",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 54
        }
      },
      "source": [
        "jun_29_operations.take(1)"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[Row(AirCraft='F-105', ContryFlyingMission='UNITED STATES OF AMERICA', MissionDate='1966-06-29', OperationSupported='STEEL TIGER', PeriodOfDay='D', TakeoffLocation='TAKHLI', TargetCountry='NORTH VIETNAM', TimeOnTarget=310.0, WeaponType='1000LB MK-83', WeaponsLoadedWeight=-1)]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 27
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "77XdZuNDSagv",
        "colab_type": "text"
      },
      "source": [
        "You can specify to cache the content in memory:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "q45a-OYwSagw",
        "colab_type": "code",
        "outputId": "48905c53-e56f-47e4-cc09-4d0a4f9a0e10",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 54
        }
      },
      "source": [
        "jun_29_operations.cache()"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "DataFrame[AirCraft: string, ContryFlyingMission: string, MissionDate: string, OperationSupported: string, PeriodOfDay: string, TakeoffLocation: string, TargetCountry: string, TimeOnTarget: double, WeaponType: string, WeaponsLoadedWeight: bigint]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 28
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "feWOqgKISagx",
        "colab_type": "text"
      },
      "source": [
        "Now you can count the number of rows and move the content to the cache:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "vIpLEQrlSagx",
        "colab_type": "code",
        "outputId": "fd51b51c-dcec-4205-ecd6-62a5e9c78930",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 68
        }
      },
      "source": [
        "%time jun_29_operations.count()"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "CPU times: user 3.17 ms, sys: 43 µs, total: 3.22 ms\n",
            "Wall time: 12.3 s\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "395"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 29
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "uCTEq5LZSagz",
        "colab_type": "text"
      },
      "source": [
        "The second time the content is cached and the operation is much faster:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "6oZtHYspSagz",
        "colab_type": "code",
        "outputId": "3d49ba8e-a132-4eeb-d34b-049fe86324df",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 68
        }
      },
      "source": [
        "%time jun_29_operations.count()"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "CPU times: user 0 ns, sys: 1.38 ms, total: 1.38 ms\n",
            "Wall time: 67.8 ms\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "395"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 30
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "_4Hzke2kSag1",
        "colab_type": "text"
      },
      "source": [
        "You can also save the results on a file..."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "4_2p0Ha9Sag1",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "jun_29_operations.write.mode('overwrite').json(\"jun_29_operations.json\")"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "OJwG61TNSag3",
        "colab_type": "text"
      },
      "source": [
        "... and read from the file:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "JTe1l78_Sag4",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "jun_29_operations = spark.read.json(\"jun_29_operations.json\")"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "DEW08u3_Sag6",
        "colab_type": "text"
      },
      "source": [
        "We can use the simple DataFrame API..."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "UYO-CuHISag8",
        "colab_type": "code",
        "outputId": "38aa77e8-cd6e-416f-d5e8-6aef8f271b78",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 289
        }
      },
      "source": [
        "TakeoffLocationCounts = jun_29_operations\\\n",
        "                            .groupBy(\"TakeoffLocation\").agg(count(\"*\").alias(\"MissionsCount\"))\\\n",
        "                            .sort(desc(\"MissionsCount\"))\n",
        "TakeoffLocationCounts.show()"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "+----------------+-------------+\n",
            "| TakeoffLocation|MissionsCount|\n",
            "+----------------+-------------+\n",
            "|   CONSTELLATION|           87|\n",
            "|          TAKHLI|           56|\n",
            "|           KORAT|           55|\n",
            "|        UDORN AB|           44|\n",
            "|         UBON AB|           44|\n",
            "|          DANANG|           35|\n",
            "|          RANGER|           35|\n",
            "|    TAN SON NHUT|           26|\n",
            "|HANCOCK (CVA-19)|           10|\n",
            "|    CAM RANH BAY|            2|\n",
            "|         CUBI PT|            1|\n",
            "+----------------+-------------+\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "2PHZStWQSag9",
        "colab_type": "text"
      },
      "source": [
        "... or the explicit Map/Reduce format with RDDs.\n",
        "\n",
        "First we emit a pair in the format (Location, 1):"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "OgEeKdtYSag9",
        "colab_type": "code",
        "outputId": "323534c4-0252-4d52-ee02-110ad5f7c72a",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        }
      },
      "source": [
        "all_locations = jun_29_operations.rdd.map(lambda row: (row.TakeoffLocation, 1))\n",
        "all_locations.take(3)"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[('TAKHLI', 1), ('DANANG', 1), ('CONSTELLATION', 1)]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 35
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Akm81xVxSag_",
        "colab_type": "text"
      },
      "source": [
        "Then, we sum counters in the reduce step, and we sort by count:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "_hVvIF_WSag_",
        "colab_type": "code",
        "outputId": "9080fac8-9346-444c-835b-ec81944c4459",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        }
      },
      "source": [
        "locations_counts_rdd = all_locations.reduceByKey(lambda a, b: a+b).sortBy(lambda r: -r[1])\n",
        "locations_counts_rdd.take(3)"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[('CONSTELLATION', 87), ('TAKHLI', 56), ('KORAT', 55)]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 40
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "od5h9c6qSahB",
        "colab_type": "text"
      },
      "source": [
        "Now we can convert the RDD in dataframe by mapping the pairs to objects of type `Row`"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "KNDn84R_SahB",
        "colab_type": "code",
        "outputId": "91228949-37cc-46b5-834a-dd3d52d1fe5f",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 289
        }
      },
      "source": [
        "locations_counts_with_schema = locations_counts_rdd.map(lambda r: Row(TakeoffLocation=r[0], MissionsCount=r[1]))\n",
        "locations_counts = spark.createDataFrame(locations_counts_with_schema)\n",
        "locations_counts.show()"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "+-------------+----------------+\n",
            "|MissionsCount| TakeoffLocation|\n",
            "+-------------+----------------+\n",
            "|           87|   CONSTELLATION|\n",
            "|           56|          TAKHLI|\n",
            "|           55|           KORAT|\n",
            "|           44|         UBON AB|\n",
            "|           44|        UDORN AB|\n",
            "|           35|          DANANG|\n",
            "|           35|          RANGER|\n",
            "|           26|    TAN SON NHUT|\n",
            "|           10|HANCOCK (CVA-19)|\n",
            "|            2|    CAM RANH BAY|\n",
            "|            1|         CUBI PT|\n",
            "+-------------+----------------+\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "cE8asfBPSahD",
        "colab_type": "text"
      },
      "source": [
        "<img style=\"float: right;\" src=\"https://raw.githubusercontent.com/epfl-ada/2019/c17af0d3c73f11cb083717b7408fedd86245dc4d/Tutorials/04%20-%20Scaling%20Up/img/USS_Constellation.jpg\">\n",
        "\n",
        "\n",
        "That day the most common take-off location was the ship USS Constellation (CV-64). We cannot univocally identify one take off location, but we can reduce the possible candidates. Next steps: explore TimeOnTarget feature.\n",
        "\n",
        "_USS Constellation (CV-64), a Kitty Hawk-class supercarrier, was the third ship of the United States Navy to be named in honor of the \"new constellation of stars\" on the flag of the United States. One of the fastest ships in the Navy, as proven by her victory during a battlegroup race held in 1985, she was nicknamed \"Connie\" by her crew and officially as \"America's Flagship\"._"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "lKKM6VS8SahD",
        "colab_type": "text"
      },
      "source": [
        "----"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "aaiVcdF8SahD",
        "colab_type": "text"
      },
      "source": [
        "## Questions 4: What is the most used aircraft type during the Vietnam war (number of missions)?\n",
        "\n",
        "Keywords: `join` `group by`"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "xnV48FZlSahG",
        "colab_type": "text"
      },
      "source": [
        "Let's check the content of `Aircraft_Glossary`:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "yovhBV5sSahI",
        "colab_type": "code",
        "outputId": "0d1387ec-f5a9-464d-eef1-650ee90949a6",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 204
        }
      },
      "source": [
        "Aircraft_Glossary.show(5)"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "+--------+--------------------+--------------------+\n",
            "|AirCraft|        AirCraftName|        AirCraftType|\n",
            "+--------+--------------------+--------------------+\n",
            "|     A-1|Douglas A-1 Skyra...|         Fighter Jet|\n",
            "|    A-26|Douglas A-26 Invader|        Light Bomber|\n",
            "|    A-37|Cessna A-37 Drago...|Light ground-atta...|\n",
            "|     A-4|McDonnell Douglas...|         Fighter Jet|\n",
            "|     A-5|North American A-...|          Bomber Jet|\n",
            "+--------+--------------------+--------------------+\n",
            "only showing top 5 rows\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "yO0ExxRoSahJ",
        "colab_type": "text"
      },
      "source": [
        "We are interested in the filed `AirCraftType`."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Z4DnpCTmSahJ",
        "colab_type": "code",
        "outputId": "57b9443c-111c-4a05-af97-b1d1b468b01a",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 204
        }
      },
      "source": [
        "Bombing_Operations.select(\"AirCraft\").show(5)"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "+--------+\n",
            "|AirCraft|\n",
            "+--------+\n",
            "|   EC-47|\n",
            "|   EC-47|\n",
            "|    RF-4|\n",
            "|     A-1|\n",
            "|    A-37|\n",
            "+--------+\n",
            "only showing top 5 rows\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Z97Y9DuUSahK",
        "colab_type": "text"
      },
      "source": [
        "We can join on the column `AirCraft` of both dataframes."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "9txA3mx1SahL",
        "colab_type": "text"
      },
      "source": [
        "With Dataframe API:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "s3j3Fu8kSahL",
        "colab_type": "code",
        "outputId": "4faaf996-e3d2-4a9b-be7f-015d1f76a6a9",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 54
        }
      },
      "source": [
        "missions_joined = Bombing_Operations.join(Aircraft_Glossary, \n",
        "                                          Bombing_Operations.AirCraft == Aircraft_Glossary.AirCraft)\n",
        "missions_joined"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "DataFrame[AirCraft: string, ContryFlyingMission: string, MissionDate: string, OperationSupported: string, PeriodOfDay: string, TakeoffLocation: string, TargetCountry: string, TimeOnTarget: double, WeaponType: string, WeaponsLoadedWeight: bigint, AirCraft: string, AirCraftName: string, AirCraftType: string]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 43
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "QhQbN8AOSahN",
        "colab_type": "text"
      },
      "source": [
        "We can select only the field we are interested in:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "s5KgFBXASahO",
        "colab_type": "code",
        "outputId": "42a94391-7cd5-4e0e-eb31-20750f6b9c4b",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 204
        }
      },
      "source": [
        "missions_aircrafts = missions_joined.select(\"AirCraftType\")\n",
        "missions_aircrafts.show(5)"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "+--------------------+\n",
            "|        AirCraftType|\n",
            "+--------------------+\n",
            "|Military Transpor...|\n",
            "|Military Transpor...|\n",
            "|  Fighter bomber jet|\n",
            "|         Fighter Jet|\n",
            "|Light ground-atta...|\n",
            "+--------------------+\n",
            "only showing top 5 rows\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "giUuCERTSahT",
        "colab_type": "text"
      },
      "source": [
        "And finally we can group by `AirCraftType` and count:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "S0QytpygSahU",
        "colab_type": "code",
        "outputId": "bf64d777-2406-4963-e39c-8bc703186f42",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 459
        }
      },
      "source": [
        "missions_aircrafts.groupBy(\"AirCraftType\").agg(count(\"*\").alias(\"MissionsCount\"))\\\n",
        "                  .sort(desc(\"MissionsCount\"))\\\n",
        "                  .show()"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "+--------------------+-------------+\n",
            "|        AirCraftType|MissionsCount|\n",
            "+--------------------+-------------+\n",
            "|  Fighter Jet Bomber|      1073126|\n",
            "|         Fighter Jet|       882594|\n",
            "|  Jet Fighter Bomber|       451385|\n",
            "|     Attack Aircraft|       315246|\n",
            "|Light ground-atta...|       267457|\n",
            "|  Fighter bomber jet|       242231|\n",
            "|Military Transpor...|       228426|\n",
            "|  Utility Helicopter|       146653|\n",
            "|    Strategic bomber|        99100|\n",
            "|     Tactical Bomber|        82219|\n",
            "|Observation Aircraft|        81820|\n",
            "|Fixed wing ground...|        75058|\n",
            "|Ground attack air...|        73843|\n",
            "|Carrier-based Fig...|        58691|\n",
            "|   Training Aircraft|        48435|\n",
            "|       Light fighter|        39999|\n",
            "|        Light Bomber|        39262|\n",
            "|Light Tactical Bo...|        34738|\n",
            "| Light Utility Plane|        28582|\n",
            "|Observation/ Ligh...|        24491|\n",
            "+--------------------+-------------+\n",
            "only showing top 20 rows\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "2Y1043GMSahV",
        "colab_type": "text"
      },
      "source": [
        "In alternative we can rewrite this in pure SQL:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "980KMZCOSahV",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "Bombing_Operations.registerTempTable(\"Bombing_Operations\")\n",
        "Aircraft_Glossary.registerTempTable(\"Aircraft_Glossary\")\n",
        "\n",
        "query = \"\"\"\n",
        "SELECT AirCraftType, count(*) MissionsCount\n",
        "FROM Bombing_Operations bo\n",
        "JOIN Aircraft_Glossary ag\n",
        "ON bo.AirCraft = ag.AirCraft\n",
        "GROUP BY AirCraftType\n",
        "ORDER BY MissionsCount DESC\n",
        "\"\"\"\n",
        "\n",
        "spark.sql(query).show()"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ffrW-oV2SahW",
        "colab_type": "text"
      },
      "source": [
        "The aircrafts of type `Fighter Jet Bomber` participated in most of the missions in the Vietnam war.\n",
        "\n",
        "Note: This dataset would require further cleaning and normalization. See `Fighter Jet Bomber`, `Jet Fighter Bomber`, `Fighter bomber jet`"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "6mykeyn9ut2F",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "l = []\n",
        "while(True):\n",
        "  l.extend(\"CS246\")"
      ],
      "execution_count": 0,
      "outputs": []
    }
  ]
}